package com.youku.util;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.Collections;
import java.util.List;

import org.dom4j.Element;

@SuppressWarnings("unchecked")
public class XMLHelper {

	/**
	 * 获取节点e的attribute属性，不能为空
	 * 
	 * @param e
	 * @param attribute
	 * @return
	 */
	public static String valueNotNull(Element e, String attribute) {
		String attrValue = e.attributeValue(attribute);
		if (attrValue == null) {
			assertNotNull("节点" + e.getName() + "不存在" + attribute + "属性", attrValue);
		}
		return attrValue;
	}

	/**
	 * 获取节点e的attribute属性，可以为空
	 * 
	 * @param e
	 * @param attribute
	 * @return
	 */
	public static String value(Element e, String attribute) {
		return e.attributeValue(attribute);
	}

	/**
	 * @param e
	 * @param attribute
	 * @return
	 */
	public static String valueExt(Element e, String attribute) {
		String attrValue = e.attributeValue(attribute);
		if (attrValue == null) {
			attrValue = e.elementTextTrim(attribute);
		}
		return attrValue;
	}

	/**
	 * @param e
	 * @param attribute
	 * @return
	 */
	public static String valueNotNullExt(Element e, String attribute) {
		String attrValue = e.attributeValue(attribute);
		if (attrValue == null) {
			attrValue = e.elementTextTrim(attribute);
			assertNotNull("节点" + e.getName() + "不存在" + attribute + "属性", attrValue);
		}
		return attrValue;
	}

	/**
	 * 获取e的子标签elementName，可以为空。但是不可以同时使用多个
	 * 
	 * @param e
	 * @param elementName
	 * @return
	 */
	public static Element element(Element e, String elementName) {
		int size = e.elements(elementName).size();
		assertTrue("这里不可以同时使用多个" + elementName + "标签", size == 0 || size == 1);
		return e.element(elementName);
	}

	/**
	 * 获取e的子标签elementName，不能为空，并且不能同时使用多个
	 * 
	 * @param e
	 * @param elementName
	 * @return
	 */
	public static Element elementNotNull(Element e, String elementName) {
		Element element = e.element(elementName);

		assertNotNull("缺少" + elementName + "标签", element);

		return element;
	}

	public static List<Element> elements(Element element, String elementName) {
		if (element == null)
			return Collections.emptyList();
		return element.elements(elementName);
	}

	public static List<Element> elements(Element element) {
		if (element == null)
			return Collections.emptyList();
		return element.elements();
	}

	public static String elementTextTrim(Element element, String attribute) {
		return element.elementTextTrim(attribute);
	}
}
